<%@ page contentType="text/html;charset=UTF-8" %>

<%--JSTL 标签库，JSP页面中使用Jstl提供的标签库来实现各种通用功能--%>
<%--taglib指令是用来导入标签库的--%>
<%@ taglib prefix="custom" uri="http://xyz.lisys/taglib/custom" %>

<%-- https://www.runoob.com/jsp/jsp-jstl.html --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="ctx" value="${pageContext.request.contextPath}"/>

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JSP</title>
</head>
<body>

<div>
    <h1>JSP语法</h1>
    <div>
        <%--jsp:scriptlet--%>
        <%
            out.println("代码片段");
        %>

        <%--jsp:declaration--%>
        <%! int i = 0; %>

        <%--jsp:expression--%>
        <%=i %>

        <%--jsp:directive--%>
        <%--page|taglib|include--%>

        <%--
            JSP 动作元素：
                - jsp:include
                - jsp:useBean
                - jsp:setProperty
                - jsp:getProperty
                - jsp:forward
                - jsp:plugin
                - jsp:element
                - jsp:attribute
                - jsp:body
                - jsp:text
        --%>
    </div>
</div>

<div>
    <h1>JSP生命周期</h1>
    <div>
        <%!
            private int initVar = 0;
            private int serviceVar = 0;
            private int destroyVar = 0;
        %>

        <%!
            public void jspInit() {
                initVar++;
                System.out.println("jspInit(): JSP被初始化了" + initVar + "次");
            }

            public void jspDestroy() {
                destroyVar++;
                System.out.println("jspDestroy(): JSP被销毁了" + destroyVar + "次");
            }
        %>

        <%
            serviceVar++;
            System.out.println("_jspService(): JSP共响应了" + serviceVar + "次请求");

            String content1 = "初始化次数 : " + initVar;
            String content2 = "响应客户请求次数 : " + serviceVar;
            String content3 = "销毁次数 : " + destroyVar;
        %>
        <h1>JSP 测试实例</h1>
        <p><%=content1 %>
        </p>
        <p><%=content2 %>
        </p>
        <p><%=content3 %>
        </p>
    </div>
</div>

<div>
    <h1>JSP九大隐含对象</h1>
    <ul>
        <li>pageContext: PageContext类的实例，提供对JSP页面所有对象以及命名空间的访问</li>
        <li>page: 类似于Java类中的this关键字</li>
        <li>application：表示应用程序级别的作用域，即在应用程序中所有的JSP页面都可以访问到这个作用域中的内容，可以在web.xml文件中设置
            context-param 来设置全局参数，然后在应用程序中使用application作用域来访问这个全局参数
        </li>
        <li>session：表示会话级别的作用域，即在同一个浏览器中访问到的所有JSP页面都可以访问这个作用域中的内容。通过调用session对象的
            setAttribute() 和 getAttribute() 方法来访问和设置会话作用域中的内容
        </li>
        <li>request：表示请求级别的作用域，即只有当前请求和转发的所有JSP页面可以访问这个作用域中的内容。通过调用request对象的
            setAttribute() 和 getAttribute() 方法来访问和设置请求作用域中的内容
        </li>
        <li>response：表示响应对象，可以通过它来访问与 HTTP
            响应相关的信息，如设置响应头部信息，设置响应的状态码，或者向浏览器输出内容等
        </li>
        <li>out：通过它可以向浏览器输出内容，例如，可以使用out.println()方法向输出流中输出字符串</li>
        <li>config：表示JSP页面的配置对象，可以用于读取当前JSP页面的配置信息，如读取页面的初始化参数等</li>
        <li>exception：表示发生异常时的异常对象，可以通过它来获取异常的相关信息，如异常类型、异常消息等信息</li>
    </ul>
</div>

<div>
    <h1>EL表达式内置对象</h1>
    <ul>
        <li>pageContext: 表示当前 JSP 页面的 pageContext 对象</li>
        <li>pageScope: 获取 page 范围的变量</li>
        <li>requestScope: 获取 page 范围的变量</li>
        <li>sessionScope: 获取 page 范围的变量</li>
        <li>applicationScope: 获取 page 范围的变量</li>
        <li>initParam: 获取初始化配置的参数值</li>
        <li>param: 相当于 request.getParameter(String name)，获取单个参数的值</li>
        <li>paramValues: 获取请求参数的所有值</li>
        <li>header: 相当于 request.getHeader(String name)，获取 HTTP 请求头信息</li>
        <li>headerValues: 相当于 request.getHeaders(String name)，获取 HTTP 请求头数组信息</li>
        <li>cookie: 相当于 request.getCookies()，获取 cookie 中的值</li>
    </ul>
</div>

</body>
</html>
